//
// Created by DengLibin on 2019/1/11 0011.
//
/**
 * 给定一个链表，两两交换其中相邻的节点，并返回交换后的链表。

示例:

给定 1->2->3->4, 你应该返回 2->1->4->3.
 说明:
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值，而是需要实际的进行节点交换。
 */

#include <iostream>
#include <vector>
using namespace std;
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

ListNode* swapPairs(ListNode* head) {

     ListNode * currentNode = head;//当前节点
     ListNode *tempNode = NULL; //存当前节点的下一个节点的下一个节点
    if(head == NULL || head->next == NULL){
        return head;
    }
    ListNode * newHead = head->next; //返回的节点
    ListNode * preNode = NULL; //上一次两两交换后的第二个节点
    while (true){
        tempNode = currentNode->next->next;
        if(preNode != NULL){
            preNode->next = currentNode->next;
        }
        currentNode->next->next = currentNode;
        currentNode->next = tempNode;
        preNode = currentNode;
        currentNode = tempNode;
        if(currentNode == NULL || currentNode->next == NULL){
            break;
        }
    }
    return newHead;


}


int main58(){
    ListNode l1(1);
    ListNode l2(2);
    ListNode l3(4);
    ListNode l4(3);
    ListNode l5(5);
    ListNode l6(6);
    l1.next = &l2;
    l2.next = &l3;
    l3.next = &l4;
    l4.next = &l5;
    l5.next = &l6;
    ListNode* head =  swapPairs(&l1);
    ListNode * temp = head;
    while(temp != NULL){
        cout <<temp->val<<",";
        temp = temp->next;
    }
    return 0;
}